有了 docker-compose.yml 之後我們還有一些待辦事項,接著在 /airflow
建立 Dockerfile
FROM apache/airflow:2.2.4-python3.9
USER root
# Install required packages
RUN apt-get update && \
apt-get install -y vim && \
apt-get install -y libpq-dev && \
apt-get clean
USER airflow
COPY requirements.txt .
# Install additional Python packages
RUN pip install --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
提供 Airflow image 所需要的套件
pymongo
python-dotenv
pycryptodome==3.18.0
rich==13.4.2
tw_invoice==2023.9.6
Airflow 在第一次啟動的時候比必須做 airflow db init
和初始化管理員帳號,但我實在不太想要每次都記這些指令。因此設計一個 shell script 來做事,就是到 airflow 容器裡幫我做初始化和建立管理者帳號
(若沒有建立管理者帳號,登入 Airflow 還是不能使用,因為一開始就會請你輸入帳密)
export AIRFLOW_HOME="$(pwd)"
IS_INITDB=True
AIRFLOW_USER=admin
AIRFLOW_PASSWORD=admin
AIRFLOW_USER_EMAIL=test@gmail.com
if [ $IS_INITDB ]; then
echo "Initializing Airflow DB setup and Admin user setup because value of IS_INITDB is $IS_INITDB"
echo " Airflow admin username will be $AIRFLOW_USER"
docker exec -ti airflow_webserver airflow db init && echo "Initialized airflow DB"
docker exec -ti airflow_webserver airflow users create --role Admin --username $AIRFLOW_USER --password $AIRFLOW_PASSWORD -e $AIRFLOW_USER_EMAIL -f airflow -l airflow && echo "Created airflow Initial admin user with username $AIRFLOW_USER"
else
echo "Skipping InitDB and InitUser setup because value of IS_INITDB is $IS_INITDB"
fi
而這個步驟基本上只要做一次,為什麼呢?
可以發現昨天的 docker-compose.yml 有 volume
所以即使你刪除容器資料也不會消失 (真的想刪除的話可以刪除 volume 就會不見了)
volumes:
postgres_data:
可以依照以下的指令執行
docker-compose up -d
docker exec -it postgres psql -U postgres
CREATE DATABASE invoice;
docker-compose up -d
(因為 airflow_webserver、airflow_scheduler 可能因為沒有 Postgres 先掛掉了)